home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / GNU / GNUPLOTsrc.lha / strftime.c < prev    next >
C/C++ Source or Header  |  1996-01-22  |  5KB  |  215 lines

  1. #define NOTIMEZONE
  2.  
  3. #ifndef lint
  4. static char *RCSid="$Id: strftime.c,v 1.4 1995/12/07 21:41:12 drd Exp $";
  5. #endif
  6.  
  7. /*
  8.  * Implementation of strftime for systems missing this (e.g. vaxctrl)
  9.  *
  10.  * This code was written based on the NeXT strftime man-page, sample output of
  11.  * the function and an ANSI-C quickreference chart. This code does not use
  12.  * parts of any existing strftime implementation.
  13.  *
  14.  * Apparently not all format chars are implemented, but this was all I had in
  15.  * my documentation.
  16.  *
  17.  * (written by Alexander Lehmann)
  18.  */
  19.  
  20. #include <time.h>
  21. #include <string.h>
  22. #include <stdio.h>
  23. #include "setshow.h"  /* for days/months */
  24.  
  25. #ifdef TEST /* test case */
  26. #define strftime _strftime
  27. #else
  28. #define const /**/
  29. #endif
  30.  
  31.  
  32. static void fill(from, pto, pmaxsize)
  33.      char *from;
  34.      char **pto;
  35.      size_t *pmaxsize;
  36. {
  37.   strncpy(*pto, from, *pmaxsize);
  38.   if(*pmaxsize<strlen(from)) {
  39.     (*pto)+=*pmaxsize;
  40.     *pmaxsize=0;
  41.   } else {
  42.     (*pto)+=strlen(from);
  43.     (*pmaxsize)-=strlen(from);
  44.   }
  45. }
  46.  
  47. static void number(num, pad, pto, pmaxsize)
  48.      int num;
  49.      int pad;
  50.      char **pto;
  51.      size_t *pmaxsize;
  52. {
  53.   char str[100];
  54.   
  55.   sprintf(str, "%0*d", pad, num);
  56.   fill(str, pto, pmaxsize);
  57. }
  58.  
  59. size_t strftime(s, max, format, tp)
  60.      char *s;
  61.      size_t max;
  62.      const char *format;
  63.      const struct tm *tp;
  64. {
  65.   char *start=s;
  66.   size_t maxsize=max;
  67.  
  68.   if(max>0) {
  69.     while(*format && max>0) {
  70.       if(*format!='%') {
  71.           *s++=*format++;
  72.     max--;
  73.       } else {
  74.         format++;
  75.     switch(*format++) {
  76.       case 'a': /* abbreviated weekday name */
  77.         if(tp->tm_wday>=0 && tp->tm_wday<=6)
  78.           fill(abbrev_day_names[tp->tm_wday], &s, &max);
  79.         break;
  80.       case 'A': /* full name of the weekday */
  81.         if(tp->tm_wday>=0 && tp->tm_wday<=6)
  82.           fill(full_day_names[tp->tm_wday], &s, &max);
  83.         break;
  84.       case 'b': /* abbreviated month name */
  85.         if(tp->tm_mon>=0 && tp->tm_mon<=11)
  86.           fill(abbrev_month_names[tp->tm_mon], &s, &max);
  87.         break;
  88.       case 'B': /* full name of month */
  89.         if(tp->tm_mon>=0 && tp->tm_mon<=11)
  90.           fill(full_month_names[tp->tm_mon], &s, &max);
  91.         break;
  92.       case 'c': /* locale's date and time reprensentation */
  93.         strftime(s, max, "%a %b %X %Y", tp);
  94.         max-=strlen(s);
  95.         s+=strlen(s);
  96.         break;
  97.       case 'd': /* day of the month (01-31) */
  98.         number(tp->tm_mday, 2, &s, &max);
  99.         break;
  100.       case 'H': /* hour of the day (00-23) */
  101.         number(tp->tm_hour, 2, &s, &max);
  102.         break;
  103.       case 'I': /* hour of the day (01-12) */
  104.         number((tp->tm_hour+11)%12+1, 2, &s, &max);
  105.         break;
  106.       case 'j': /* day of the year (001-366) */
  107.         number(tp->tm_yday+1, 3, &s, &max);
  108.         break;
  109.       case 'm': /* month of the year (01-12) */
  110.         number(tp->tm_mon+1, 2,&s, &max);
  111.         break;
  112.       case 'M': /* minute (00-59) */
  113.         number(tp->tm_min, 2, &s, &max);
  114.         break;
  115.       case 'p': /* locale's version of AM or PM */
  116.         fill(tp->tm_hour>=6 ? "PM" : "AM", &s, &max);
  117.         break;
  118.       case 'S': /* seconds (00-59) */
  119.         number(tp->tm_sec, 2, &s, &max);
  120.         break;
  121.       case 'U': /* week number of the year (00-53) with Sunday as the first day of the week */
  122.         number((tp->tm_yday-(tp->tm_yday-tp->tm_wday+7)%7+7)/7, 1, &s, &max);
  123.         break;
  124.       case 'w': /* weekday (Sunday=0 to Saturday=6) */
  125.         number(tp->tm_wday, 1, &s, &max);
  126.         break;
  127.       case 'W': /* week number of the year (00-53) with Monday as the first day of the week */
  128.         number((tp->tm_yday-(tp->tm_yday-tp->tm_wday+8)%7+7)/7, 2, &s, &max);
  129.         break;
  130.       case 'x': /* locale's date representation */
  131.         strftime(s, max, "%a %b %d %Y", tp);
  132.         max-=strlen(s);
  133.         s+=strlen(s);
  134.         break;
  135.       case 'X': /* locale's time representation */
  136. #ifndef NOTIMEZONE
  137.         strftime(s, max, "%H:%M:%S %Z", tp);
  138. #else
  139.         strftime(s, max, "%H:%M:%S", tp);
  140. #endif
  141.         max-=strlen(s);
  142.         s+=strlen(s);
  143.         break;
  144.       case 'y': /* two-digit year representation (00-99) */
  145.         number(tp->tm_year%100, 2, &s, &max);
  146.         break;
  147.       case 'Y': /* four-digit year representation */
  148.         number(tp->tm_year+1900, 2, &s, &max);
  149.         break;
  150. #ifndef NOTIMEZONE
  151.       case 'Z': /* time zone name */
  152.         fill(tp->tm_zone, &s, &max);
  153.         break;
  154. #endif
  155.       case '%': /* percent sign */
  156.       default:
  157.         *s++=*(format-1);
  158.         max--;
  159.         break;
  160.       }
  161.       }
  162.     }
  163.     if(s-start<maxsize) {
  164.       *s++='\0';
  165.     } else {
  166.       *(s-1)='\0';
  167.     }
  168.   }
  169.   
  170.   return s-start;
  171. }
  172.  
  173. #ifdef TEST
  174.  
  175. #undef strftime
  176. #define test(s)                \
  177.     printf("%s -> ",s );        \
  178.     _strftime(str, 100, s, ts);    \
  179.     printf("%s - ", str);        \
  180.     strftime(str, 100, s, ts);    \
  181.     printf("%s\n", str)
  182.  
  183. int main()
  184. {
  185.   char str[100];
  186.   struct tm *ts;
  187.   time_t t;
  188.   int i;
  189.  
  190.   t=time(NULL);
  191.  
  192.   ts=localtime(&t);
  193.  
  194.   test("%c");
  195.   test("test%%test");
  196.   test("%a %b %d %X %Y");
  197.   test("%x %X");
  198.   test("%A %B %U");
  199.   test("%I:%M %p %j %w");
  200.  
  201.   t-=245*24*60*60;
  202.  
  203.   for(i=0;i<366;i++) {
  204.     ts=localtime(&t);
  205.     printf("%03d: ", i);
  206.     test("%a %d %m %W");
  207.     t+=24*60*60;
  208.   }
  209.  
  210.   return 0;
  211. }
  212.  
  213. #endif
  214.  
  215.